package org.codefx.mvn.jdeps.rules;
import org.junit.Test;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Abstract superclass for tests of {@link DependencyJudge} implementations.
*/
public abstract class AbstractDependencyJudgeTest {
// #begin BUILDER
@Test(expected = NullPointerException.class)
public void addDependency_ruleNull_throwsException() {
builder().addDependency(null);
}
@Test(expected = IllegalArgumentException.class)
public void addDependency_alreadyDefinedWithDifferentSeverity_throwsException() {
builder().
withDefaultSeverity(Severity.FAIL)
.addDependency(DependencyRule.of("com.foo.bar", "sun.misc.Unsafe", Severity.INFORM))
.addDependency(DependencyRule.of("com.foo.bar", "sun.misc.Unsafe", Severity.WARN));
}
@Test
public void addDependency_alreadyDefinedWithSameSeverity_throwsNoException() {
builder().
withDefaultSeverity(Severity.FAIL)
.addDependency(DependencyRule.of("com.foo.bar", "sun.misc.Unsafe", Severity.WARN))
.addDependency(DependencyRule.of("com.foo.bar", "sun.misc.Unsafe", Severity.WARN));
}
@Test(expected = IllegalStateException.class)
public void build_alreadyCalled_throwsException() {
DependencyJudgeBuilder builder = builder().withDefaultSeverity(Severity.FAIL);
builder.build();
builder.build();
}
// #end BUILDER
// #begin JUDGE
@Test
public void judgeSeverity_noRules_defaultValue() {
for (Severity defaultSeverity : Severity.values()) {
DependencyJudge judge = builder().
withDefaultSeverity(defaultSeverity).build();
// class -> class
assertThat(judge.judgeSeverity("com.foo.Bar", "sun.misc.Unsafe")).isSameAs(defaultSeverity);
// class -> package
assertThat(judge.judgeSeverity("com.foo.Bar", "sun.misc")).isSameAs(defaultSeverity);
assertThat(judge.judgeSeverity("com.foo.Baz", "sun")).isSameAs(defaultSeverity);
// package -> class
assertThat(judge.judgeSeverity("com.foo", "sun.misc.Unsafe")).isSameAs(defaultSeverity);
assertThat(judge.judgeSeverity("com", "sun.misc.Unsafe")).isSameAs(defaultSeverity);
// package -> package
assertThat(judge.judgeSeverity("com.foo", "sun.misc")).isSameAs(defaultSeverity);
assertThat(judge.judgeSeverity("com.foo", "sun.misc")).isSameAs(defaultSeverity);
}
}
@Test
public void judgeSeverity_exactMatch_definedSeverity() {
DependencyJudge judge = builder().
withDefaultSeverity(Severity.INFORM)
// this rule should be applied
.addDependency("com.foo.Bar", "sun.misc.Unsafe", Severity.FAIL)
.build();
Severity severity = judge.judgeSeverity("com.foo.Bar", "sun.misc.Unsafe");
assertThat(severity).isSameAs(Severity.FAIL);
}
@Test
public void judgeSeverity_dependentOccursInMoreSpecialRule_ruleIsNotApplied() {
DependencyJudge judge = builder().
withDefaultSeverity(Severity.INFORM)
// the rule defined for "com.foo.Bar" MUST NOT be applied to "com.foo"
.addDependency("com.foo.Bar", "sun.misc.Unsafe", Severity.FAIL)
.build();
Severity severity = judge.judgeSeverity("com.foo", "sun.misc.Unsafe");
assertThat(severity).isSameAs(Severity.INFORM);
}
@Test
public void judgeSeverity_dependentOccursInSamePackageRule_ruleIsNotApplied() {
DependencyJudge judge = builder().
withDefaultSeverity(Severity.INFORM)
// the rule defined for "com.foo.Bar" MUST NOT be applied to "com.foo.Baz"
.addDependency("com.foo.Bar", "sun.misc.Unsafe", Severity.FAIL)
.build();
Severity severity = judge.judgeSeverity("com.foo.Baz", "sun.misc.Unsafe");
assertThat(severity).isSameAs(Severity.INFORM);
}
@Test
public void judgeSeverity_dependentCoveredByMoreGeneralRuleForContainingPackage_ruleIsApplied() {
DependencyJudge judge = builder().
withDefaultSeverity(Severity.INFORM)
// this rule should be applied
.addDependency("com.foo", "sun.misc.Unsafe", Severity.FAIL)
.build();
Severity severity = judge.judgeSeverity("com.foo.Bar", "sun.misc.Unsafe");
assertThat(severity).isSameAs(Severity.FAIL);
}
@Test
public void judgeSeverity_dependencyOccursInMoreSpecialRule_ruleIsNotApplied() {
DependencyJudge judge = builder().
withDefaultSeverity(Severity.INFORM)
// this rule defined for "sun.misc.Unsafe" MUST NOT be applied to "sun.misc"
.addDependency("com.foo.Bar", "sun.misc.Unsafe", Severity.FAIL)
.build();
Severity severity = judge.judgeSeverity("com.foo.Bar", "sun.misc");
assertThat(severity).isSameAs(Severity.INFORM);
}
@Test
public void judgeSeverity_dependencyOccursInSamePackageRule_ruleIsNotApplied() {
DependencyJudge judge = builder().
withDefaultSeverity(Severity.INFORM)
// this rule defined for "sun.misc.Unsafe" MUST NOT be applied to "sun.misc.BASE64Encoder"
.addDependency("com.foo.Bar", "sun.misc.Unsafe", Severity.FAIL)
.build();
Severity severity = judge.judgeSeverity("com.foo.Bar", "sun.misc.BASE64Encoder");
assertThat(severity).isSameAs(Severity.INFORM);
}
@Test
public void judgeSeverity_dependencyCoveredByMoreGeneralRuleForContainingPackage_ruleIsApplied() {
DependencyJudge judge = builder().
withDefaultSeverity(Severity.INFORM)
// this rule should be applied
.addDependency("com.foo.Bar", "sun.misc", Severity.FAIL)
.build();
Severity severity = judge.judgeSeverity("com.foo.Bar", "sun.misc.Unsafe");
assertThat(severity).isSameAs(Severity.FAIL);
}
@Test
public void judgeSeverity_bothCoveredByMoreGeneralRule_ruleIsApplied() {
DependencyJudge judge = builder().
withDefaultSeverity(Severity.INFORM)
// this rule should be applied
.addDependency("com.foo", "sun.misc", Severity.FAIL)
.build();
Severity severity = judge.judgeSeverity("com.foo.Bar", "sun.misc.Unsafe");
assertThat(severity).isSameAs(Severity.FAIL);
}
@Test
public void judgeSeverity_dependentCoveredByTwoRules_mostSpecialRuleIsApplied() {
DependencyJudge judge = builder().
withDefaultSeverity(Severity.INFORM)
.addDependency("com.foo", "sun.misc", Severity.WARN)
.addDependency("com.foo.Bar", "sun.misc", Severity.FAIL)
.addDependency("com.foo.Bar.Inner", "sun.misc", Severity.WARN)
.build();
Severity severity = judge.judgeSeverity("com.foo.Bar", "sun.misc.Unsafe");
assertThat(severity).isSameAs(Severity.FAIL);
}
@Test
public void judgeSeverity_dependencyCoveredByTwoRules_mostSpecialRuleIsApplied() {
DependencyJudge judge = builder().
withDefaultSeverity(Severity.INFORM)
.addDependency("com.foo.Bar", "sun.misc", Severity.WARN)
.addDependency("com.foo.Bar", "sun.misc.Unsafe", Severity.FAIL)
.addDependency("com.foo.Bar", "sun.misc.Unsafe.Inner", Severity.WARN)
.build();
Severity severity = judge.judgeSeverity("com.foo.Bar", "sun.misc.Unsafe");
assertThat(severity).isSameAs(Severity.FAIL);
}
@Test
public void judgeSeverity_bothCoveredByTwoRules_mostSpecialRuleIsApplied() {
DependencyJudge judge = builder().
withDefaultSeverity(Severity.INFORM)
.addDependency("com.foo", "sun.misc.Unsafe", Severity.WARN)
.addDependency("com.foo.Bar", "sun.misc", Severity.WARN)
.addDependency("com.foo.Bar", "sun.misc.Unsafe", Severity.FAIL)
.addDependency("com.foo.Bar.Inner", "sun.misc.Unsafe", Severity.WARN)
.addDependency("com.foo.Bar", "sun.misc.Unsafe.Inner", Severity.WARN)
.build();
Severity severity = judge.judgeSeverity("com.foo.Bar", "sun.misc.Unsafe");
assertThat(severity).isSameAs(Severity.FAIL);
}
@Test
public void judgeSeverity_bestMatchingDependentHasNoRuleForDependency_moreGeneralRuleIsApplied() {
DependencyJudge judge = builder().
withDefaultSeverity(Severity.INFORM)
// this rule should be applied
.addDependency("com.foo", "sun.misc", Severity.FAIL)
// this rule matches the dependant but has no rule for the dependency, so it should not be applied
.addDependency("com.foo.Bar", "sun.misc.Unsafe.Inner", Severity.WARN)
.build();
Severity severity = judge.judgeSeverity("com.foo.Bar", "sun.misc.Unsafe");
assertThat(severity).isSameAs(Severity.FAIL);
// for demonstration purposes, check that the second rule does apply given a matching dependency
assertThat(judge.judgeSeverity("com.foo.Bar", "sun.misc.Unsafe.Inner")).isSameAs(Severity.WARN);
}
@Test
public void judgeSeverity_dependentCoveredByWildcardRule_ruleIsApplied() {
DependencyJudge judge = builder().
withDefaultSeverity(Severity.INFORM)
.addDependency(DependencyRule.ALL_TYPES_WILDCARD, "sun.misc.Unsafe", Severity.FAIL)
.build();
assertThat(judge.judgeSeverity("com.foo.Bar", "sun.misc.Unsafe")).isSameAs(Severity.FAIL);
assertThat(judge.judgeSeverity("net.Foo", "sun.misc.Unsafe")).isSameAs(Severity.FAIL);
assertThat(judge.judgeSeverity("org", "sun.misc.Unsafe")).isSameAs(Severity.FAIL);
}
@Test
public void judgeSeverity_dependencyCoveredByWildcardRule_ruleIsApplied() {
DependencyJudge judge = builder().
withDefaultSeverity(Severity.INFORM)
.addDependency("com.foo.Bar", DependencyRule.ALL_TYPES_WILDCARD, Severity.FAIL)
.build();
assertThat(judge.judgeSeverity("com.foo.Bar", "sun.misc.Unsafe")).isSameAs(Severity.FAIL);
assertThat(judge.judgeSeverity("com.foo.Bar", "sun.misc.BASE64Encoder")).isSameAs(Severity.FAIL);
assertThat(judge.judgeSeverity("com.foo.Bar", "sun.")).isSameAs(Severity.FAIL);
}
@Test
public void judgeSeverity_bothDependenciesCoveredByWildcardRule_ruleIsApplied() {
DependencyJudge judge = builder().
withDefaultSeverity(Severity.INFORM)
.addDependency(DependencyRule.ALL_TYPES_WILDCARD, DependencyRule.ALL_TYPES_WILDCARD, Severity.FAIL)
.build();
assertThat(judge.judgeSeverity("com.foo.Bar", "sun.misc.Unsafe")).isSameAs(Severity.FAIL);
assertThat(judge.judgeSeverity("com.foo.Bar", "sun.")).isSameAs(Severity.FAIL);
assertThat(judge.judgeSeverity("com", "sun.misc.BASE64Encoder")).isSameAs(Severity.FAIL);
}
// #end JUDGE
/**
* @return the builder for the {@code DependencyJudgeBuilder} tested by this class
*/
protected abstract DependencyJudgeBuilder builder();
}